/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-05-13     Administrator       the first version
 */
#ifndef HARDWARE_ENCODER_H_
#define HARDWARE_ENCODER_H_

#include "system.h"

#define ENCODER_RELOAD_VALUE  60000 //重装载值
#define ENCODER_CALC_PERIOD_MS 20

/*编码器的结构体*/
struct encoder_state
{
    rt_int32_t Encoder; //拿到的实时值
    volatile int32_t total_count; //总值
    volatile int32_t last_count;  //上次的值
    volatile int32_t overflow_count; //溢出的次数
    volatile uint8_t direction; //方向
    volatile rt_int32_t speed; //把编码器的值转换成速度,圈/秒
};
typedef struct encoder_state encoder_state_t;

/* 编码器初始化 */
int Encoder_init(void);

/*读取编码器的实时值，范围*/
rt_int32_t pulse_encoder_get_now_count(TIM_HandleTypeDef * htim);

/*读取编码器的实时值*/
void ReadEncoder(void);

/*周期20ms的软件定时器，编码器换算速度线程*/
void encoder_calc_entry(void *parameter);

/*获取小车电机A的速度*/
float get_encoderA_speed(void);

/*获取小车电机B的速度*/
float get_encoderB_speed(void);

/*获取小车电机C的速度*/
float get_encoderC_speed(void);

/*获取小车电机D的速度*/
float get_encoderD_speed(void);

/*获取电机A的总脉冲*/
rt_int32_t get_A_total_count(void);

/*获取电机B的总脉冲*/
rt_int32_t get_B_total_count(void);

/*获取电机C的总脉冲*/
rt_int32_t get_C_total_count(void);

/*获取电机D的总脉冲*/
rt_int32_t get_D_total_count(void);


/*用于获取小车的移动距离*/
float get_car_distance(void);

extern encoder_state_t A_encoder, B_encoder, C_encoder, D_encoder;
extern TIM_HandleTypeDef htim1;//外部声明来的定时器指针，放.c和.h都可以
extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3;
extern TIM_HandleTypeDef htim4;


#endif /* HARDWARE_ENCODER_H_ */
